home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / Command.C < prev    next >
C/C++ Source or Header  |  1990-12-05  |  2KB  |  142 lines

  1. //$Command$
  2. #include "Command.h"
  3. #include "Error.h"
  4. #include "String.h"
  5. #include "Port.h"
  6. #include "ObjectTable.h"
  7.  
  8. AbstractMetaImpl(Command, (T(CmdNumber), TP(CmdName), 0));
  9.  
  10. static Command NoChanges(0);
  11. static Command ResetUndo(0, "", eCmdCausesChange);
  12.  
  13. Command *gNoChanges= &NoChanges;
  14. Command *gResetUndo= &ResetUndo;
  15.  
  16. Command::Command(int itsCmdNumber, char *itsCmdName, CommandFlags cf) : Object(cf)
  17. {
  18.     CmdNumber= itsCmdNumber;
  19.     CmdName= itsCmdName;
  20. }
  21.  
  22. Command::Command(char *itsCmdName, CommandFlags cf) : Object(cf)
  23. {
  24.     CmdNumber= 9999;
  25.     CmdName= itsCmdName;
  26. }
  27.  
  28. Command::~Command()
  29.     if (this == gNoChanges || this == gResetUndo || !TestFlag(eCmdDoDelete)) 
  30.     this= 0;
  31. }
  32.  
  33. void Command::Commit()
  34. {
  35. }
  36.  
  37. void Command::DoIt()
  38. {
  39. }
  40.  
  41. void Command::RedoIt()
  42. {
  43.     DoIt();
  44. }
  45.  
  46. void Command::UndoIt()
  47. {
  48. }
  49.  
  50. void Command::Done(Command *newCmd)
  51. {
  52. }
  53.  
  54. void Command::TrackConstrain(Point, Point, Point *)
  55. {
  56. }
  57.  
  58. void Command::TrackFeedback(Point anchorPoint, Point nextpoint, bool)
  59. {
  60. }
  61.  
  62. Command *Command::TrackMouse(TrackPhase, Point, Point, Point)
  63. {
  64.     ResetFlag(eCmdMoveEvents);
  65.     return this;
  66. }
  67.  
  68. void Command::Finish(Command *cmd)
  69. {
  70.     if (this && this != gNoChanges && this != gResetUndo) {
  71.     if (TestFlag(eCmdDone)) {
  72.         Commit();
  73.     }
  74.     Done(cmd);
  75.     if (TestFlag(eCmdDoDelete))
  76.         delete this;
  77.     }
  78. }
  79.  
  80. char *Command::GetUndoName()
  81. {     
  82.     char *s1, *s, *cs= GetName();
  83.     
  84.     if (TestFlag(eCmdCanUndo))
  85.     s1= "";
  86.     else
  87.     s1= "can't ";
  88.  
  89.     if (TestFlag(eCmdDone))
  90.     s= "undo";
  91.     else
  92.     s= "redo";
  93.     
  94.     if (cs && *cs)
  95.     return form("%s%s %s", s1, s, cs);
  96.     return form("%s%s", s1, s);
  97. }
  98.  
  99. int Command::Undo()
  100. {
  101.     if (TestFlag(eCmdDone)) {
  102.     UndoIt();
  103.     ResetFlag(eCmdDone);
  104.     return -1;
  105.     }
  106.     RedoIt();
  107.     SetFlag(eCmdDone);
  108.     return 1;
  109. }
  110.  
  111. int Command::Do()
  112. {
  113.     DoIt();
  114.     SetFlag(eCmdDone);
  115.     if (TestFlag(eCmdCausesChange))
  116.     return 1;
  117.     return 0;
  118. }
  119.  
  120. int Command::Perform()
  121. {
  122.     int cnt= 0;
  123.     
  124.     // don't do anything on gNoChanges!!
  125.     if ((this != gNoChanges) && (CmdNumber != 0 || this == gResetUndo)) {
  126.     if (this != gResetUndo)
  127.         cnt= Do(); 
  128.     Finish(0);
  129.     }
  130.     return cnt;
  131. }
  132.  
  133. void Command::InspectorId(char *buf, int sz)
  134. {
  135.     if (GetName())
  136.     strn0cpy(buf, GetName(), sz);
  137.     else
  138.     Object::InspectorId(buf, sz);
  139. }
  140.  
  141.